# 从 flask 导入 request、jsonify 和 Blueprint
# request 用于处理 HTTP 请求，获取请求中的数据
# jsonify 用于将 Python 数据结构转换为 JSON 格式的响应
# Blueprint 用于创建 Flask 应用的蓝图，将相关的路由组织在一起
from flask import request, jsonify, Blueprint
# 从 app 导入数据库实例 db 和 LogService
# db 用于与数据库进行交互
# LogService 用于记录系统日志
from app import db, LogService
# 从 app.models 导入 Train 模型，用于与数据库中的列车表进行交互
from app.models import Train
# 从 app.models.train_lib 导入 buildTrain 函数，用于根据数据构建列车对象
from app.models.train_lib import buildTrain
# 从 presenter.train 导入 TrainPresenter，用于将 Train 模型对象转换为适合展示的数据格式
from presenter.train import TrainPresenter
# 从 utils 导入 create_response 和 StateCode
# create_response 用于创建统一格式的响应数据
# StateCode 包含各种状态码，用于表示不同的响应状态
from utils import create_response, StateCode

# 创建一个名为 'trains' 的蓝图，用于管理列车相关的路由
trains_bp = Blueprint('trains', __name__)

@trains_bp.route('/trains', methods=['GET'])
def queryAllTrains():
    """
    查询所有列车信息的路由处理函数。

    该函数接收一个 GET 请求，从数据库中查询所有的列车记录。
    遍历查询结果，将每个列车对象转换为适合展示的字典格式，
    记录日志，最后返回包含成功状态码和列车数据列表的 JSON 响应。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 从数据库中查询所有的列车记录
    trains = Train.query.all()
    # 遍历列车记录，将每个列车对象转换为适合展示的字典格式
    trains_presenters = [TrainPresenter(train).as_dict() for train in trains]
    # 记录日志
    LogService.log()
    # 返回包含成功状态码和列车数据列表的 JSON 响应，状态码为 200
    return jsonify(create_response(StateCode.SUCCESS, data=trains_presenters)), 200

@trains_bp.route('/trains', methods=['POST'])
def createTrain():
    """
    创建新列车的路由处理函数。

    该函数接收一个 POST 请求，请求中应包含列车的相关数据。
    从请求中获取 JSON 数据，使用 buildTrain 函数根据该数据构建一个新的列车对象，
    将新列车对象添加到数据库会话中并提交，将新列车对象转换为适合展示的字典格式，
    记录日志，最后返回包含成功状态码和列车数据的 JSON 响应。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 从请求中获取 JSON 数据
    data = request.json
    # 使用 buildTrain 函数根据请求数据构建一个新的列车对象
    new_train = buildTrain(data)
    # 将新列车对象添加到数据库会话中
    db.session.add(new_train)
    # 提交数据库会话，将新列车对象保存到数据库
    db.session.commit()
    # 使用 TrainPresenter 将新列车对象转换为适合展示的字典格式
    train_presenter = TrainPresenter(new_train).as_dict()
    # 记录日志
    LogService.log()
    # 返回包含成功状态码和列车数据的 JSON 响应，状态码为 200
    return jsonify(create_response(StateCode.SUCCESS, data=train_presenter)), 200